home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Communications / pop3d / Source / util.c < prev   
C/C++ Source or Header  |  1993-10-09  |  4KB  |  181 lines

  1. /*
  2.  *    pop3d        - IP/TCP/POP3 server for UNIX 4.3BSD
  3.  *              Post Office Protocol - Version 3 (RFC1225)
  4.  *
  5.  *      (C) Copyright 1991 Regents of the University of California
  6.  *
  7.  *      Permission to use, copy, modify, and distribute this program
  8.  *      for any purpose and without fee is hereby granted, provided
  9.  *      that this copyright and permission notice appear on all copies
  10.  *      and supporting documentation, the name of University of California
  11.  *      not be used in advertising or publicity pertaining to distribution
  12.  *      of the program without specific prior permission, and notice be
  13.  *      given in supporting documentation that copying and distribution is
  14.  *      by permission of the University of California.
  15.  *      The University of California makes no representations about
  16.  *      the suitability of this software for any purpose.  It is provided
  17.  *      "as is" without express or implied warranty.
  18.  *
  19.  *    Katie Stevens
  20.  *    dkstevens@ucdavis.edu
  21.  *     Information Technology -- Campus Access Point
  22.  *    University of California, Davis
  23.  *
  24.  **************************************
  25.  *
  26.  *    util.c
  27.  *
  28.  *    REVISIONS:
  29.  *        02-27-90 [ks]    original implementation
  30.  *    1.000    03-04-90 [ks]
  31.  */
  32.  
  33. #include <stdio.h>
  34. #include <ctype.h>
  35. #include <string.h>
  36. #include <pwd.h>
  37. #ifdef SHADOWPWD
  38. #include <shadow/shadow.h>
  39. #include <shadow/pwauth.h>
  40. #endif
  41. #include "pop3.h"
  42.  
  43. char flash_buf[SVR_BUFSIZ];
  44.  
  45. #ifdef DEBUG
  46. extern FILE *logfp;
  47. #endif
  48.  
  49. /**************************************************************************/
  50.  
  51. /* Verify a usercode/password */
  52. int
  53. verify_user(user,pass)
  54. char *user;
  55. char *pass;
  56. {
  57.     struct passwd *pwd;
  58. #ifdef SHADOWPWD
  59.     struct spwd *spwd;
  60. #endif
  61.     char *cp;
  62.  
  63.     pwd = getpwnam(user);
  64.     if (pwd == NULL) return -1;
  65. #ifdef SHADOWPWD
  66.     if (!(spwd = getspnam(user)))
  67.         return -1;
  68.     else
  69.         pwd->pw_passwd = spwd->sp_pwdp;
  70.     if (pwd->pw_name && pwd->pw_passwd[0] == '@') {
  71.         if (pw_auth(pwd->pw_passwd+1, user, PW_LOGIN))
  72.             return -1;
  73.         return(setuid(pwd->pw_uid));
  74.     }
  75.     if (!valid(pass, pwd))
  76.         return -1;
  77.     return(setuid(pwd->pw_uid));
  78. #else
  79.     cp = crypt(pass,pwd->pw_passwd);
  80.     if (strcmp(cp,pwd->pw_passwd) == 0) {
  81.         return(setuid(pwd->pw_uid));
  82.     } else {
  83.         return(-1);
  84.     }
  85. #endif
  86. }
  87.  
  88. /**************************************************************************/
  89.  
  90. /* Read a line of text from a stream. If more than n-1  */
  91. /* characters are read without a line terminator (LF),  */
  92. /* discard characters until line terminator is located. */
  93. char *
  94. fgetl(buf,n,fp)
  95. char *buf;    /* Buffer for text */
  96. int n;        /* Size of buffer */
  97. FILE *fp;    /* Stream to read from */
  98. {
  99.     if (fgets(buf,n,fp) == NULL)
  100.         return(NULL);
  101.     if ((strlen(buf) == (n-1))&&(buf[n-1] != LF_CHAR)) {
  102.         buf[n-1] = LF_CHAR;
  103.         while (fgets(flash_buf,SVR_BUFSIZ,fp) != NULL) {
  104.             if (strlen(flash_buf) != (SVR_BUFSIZ-1))
  105.                 break;
  106.             if (flash_buf[SVR_BUFSIZ-1] == LF_CHAR)
  107.                 break;
  108.         }
  109.     }
  110.     return(buf);
  111. }
  112.  
  113. /* Prepare client command for server */
  114. void
  115. cmd_prepare(buf)
  116. char *buf;
  117. {
  118.     char *cp;
  119.  
  120.     if (buf == NULL)
  121.         return;
  122.     /* Convert command verb to lowercase */
  123.     while (*buf != NULL_CHAR) {
  124.         if (isupper(*buf))
  125.             *buf = tolower(*buf);
  126.         else if (isspace(*buf))
  127.             break;
  128.         ++buf;
  129.     }
  130.     /* Strip trailing whitespace from client command */
  131.     if ((cp = strchr(buf,CR_CHAR)) != NULL) {
  132.         while ((cp != buf)&&(isspace(*cp))) --cp;
  133.         if (!isspace(*cp)) ++cp;
  134.         *cp = NULL_CHAR;
  135.     }
  136.     if ((cp = strchr(buf,LF_CHAR)) != NULL) {
  137.         while ((cp != buf)&&(isspace(*cp))) --cp;
  138.         if (!isspace(*cp)) ++cp;
  139.         *cp = NULL_CHAR;
  140.     }
  141. }
  142.  
  143. /**************************************************************************/
  144.  
  145. /* Send an error message and exit POP3 server */
  146. void
  147. fail(err)
  148. int err;
  149. {
  150.     char *cp;
  151.  
  152.     switch(err) {
  153.     case FAIL_FILE_ERROR:            /* File I/O error */
  154.         cp = "File I/O error";
  155.         break;
  156.     case FAIL_HANGUP:            /* Client hung up on us */
  157.         cp = "Lost connectino to client";
  158.         break;
  159.     case FAIL_LOST_CLIENT:            /* Timeout waiting for client */
  160.         cp = "Timeout waiting for command from client";
  161.         break;
  162.     case FAIL_OUT_OF_MEMORY:        /* Failed malloc() */
  163.         cp = "Out of memory!";
  164.         break;
  165.     case FAIL_PROGERR:            /* Fatal program error */
  166.         cp = "Fatal program error!";
  167.         break;
  168.     case FAIL_CONFUSION:            /* Shouldnt happen */
  169.     default:
  170.         cp = "Complete confusion!";
  171.         break;
  172.     }
  173.     fprintf(stdout,"-ERR POP3 Server Abnormal Shutdown: %s\r\n",cp);
  174.     fflush(stdout);
  175. #ifdef DEBUG
  176.     fprintf(logfp,"-ERR POP3 Server Abnormal Shutdown: %s\r\n",cp);
  177.     fclose(logfp);
  178. #endif
  179.     exit(err);                /* Exit with error */
  180. }
  181.